/**
 * Class Window()
 * 
 * @name Window
 * @super Object
 * @brief Clase para crear ventanas
 * @author Hermann D. Schimpf <hschimpf@gschimpf.com>
 * @license http://opensource.org/licenses/gpl-2.0.php
 * @date 2010-07-16
 * @type constructor
 * @version 0.1.1
 */
function Window() {
	/* llamamos al constructor */
	this.__construct(typeof arguments[0] == 'string' ? {
		/* enviamos solo el nombre */
		name: arguments[0]
	} : arguments[0]);
}
Window.prototype = new Object();
/* nombre de la instancia */
Window.prototype.name = new String("Window");
/* variable para almacenar la ventana (DIV) */
Window.prototype.win = null;
/* variable para almacenar el contenido de la ventana */
Window.prototype.content = null;
/* valor booleano que identifica si la ventana es fija, por defecto false */
Window.prototype.fixed = new Boolean(false);
/* valor del zIndex de la ventana, defaul 50 */
Window.prototype.zIndex = new Number(50);
/* valor para el alto de la ventana */
Window.prototype.height = new Number();
/* valor para el ancho de la ventana */
Window.prototype.width = new Number();
/* valor para la posicion izquierda de la ventana */
Window.prototype.left = new Number();
/* valor para la posicion superior de la ventana */
Window.prototype.top = new Number();
/* inicio de las imagenes */
Window.prototype.imgStart = new String('iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAAAd0SU1FB9oDDhIe');
/* parte del medio de las imagenes */
Window.prototype.imgMiddle = new String('AAAAYdEVYdENvbW1lbnQASERTIFByb2R1Y2Npb25lc09hwyIAAAB');
/* codigo de las imagenes de las esquinas */
Window.prototype.esquinas = new Array();
/**
 * Constructor de la clase Window
 * 
 * @param Object Parametros para la ventana
 */
Window.prototype.__construct = function(params) {
	/* almacenamos los parametos */
	this.saveParams(params);
	/* almacenamos un puntero al objeto */
	var me = this;
	/* almacenamos las imagenes de las esquinas */
	this.buildImgs();
	/* creamos un bucle */
	var init = setInterval(function() {
		/* verificamos si el dom esta listo */
		if (document.getElementsByTagName('body')[0] != undefined) {
			/* eliminamos el interval */
			clearInterval(init);
			/* iniciamos la creacion de la ventana */
			me.init();
		}
	}, 100);
	/* eliminamos la definicion del metodo */
	this.__construct = undefined;
};
/**
 * Destructor de la clase
 */
Window.prototype.__destruct = function() {
	/* eliminamos la definicion de todos los metodos */
	for ( var i in this)
		/* eliminamos la definicion del metodo */
		this[i] = undefined;
};
/**
 * Retornamos la definicion del objeto
 * 
 * @return String Definicion del Objeto
 */
Window.prototype.toString = function() {
	/* retonamos los datos del objeto como un string */
	return "Window [" + this.getName() + "] {\n\tfixed: " + this.isFixed() + "\n}";
};
/**
 * Almacenamos los parametros obtenidos
 * 
 * @param Object Parametros para la ventana
 */
Window.prototype.saveParams = function(params) {
	/* almacenamos el nombre de la instancia */
	this.name = params.name;
	/* almacenamos los valores de posicion para la ventana */
	this.setTop(params.top !== undefined ? params.top : this.getTop());
	this.setLeft(params.left !== undefined ? params.left : this.getLeft());
	/* almacenamos los valores de tamano para la ventana */
	this.height = params.height !== undefined ? params.height : this.getHeight();
	this.width = params.width !== undefined ? params.width : this.getWidth();
	/* almacenamos si la ventana es fija */
	this.fixed = params.fixed !== undefined ? params.fixed : this.isFixed();
	/* almacenamos el zIndex de la ventna */
	this.zIndex = params.zIndex !== undefined ? params.zIndex : this.getZIndex();
	/* eliminamos la definicion del metodo */
	this.saveParams = undefined;
};
/**
 * Almacenar las imagenes de las esquinas para la ventana
 */
Window.prototype.buildImgs = function() {
	/* esquina superior izquierda */
	this.esquinas['eSI'] = new Array('B42JRWg', 'mSURBVBjTfc3RDYJQDEbh7964ADqBcQPDGuLbnYIZTBiBNTqKS+lLIYSg56ntaf8WiAitNVlf8cCAvkSEpOKFEZdlWPKqYk752bpTNlPKVawJEXHDG91eLn8HnP2g4nkUvV24+8MXo2URxKs8JE8AAAAASUVORK5CYII=');
	/* esquina superior derecha */
	this.esquinas['eSD'] = new Array('JsHgVTY', 'rSURBVBjTfc1BDcJQFETR878DghWQUZZPRSUQ0MCmIt6uFYIDLHRRAZQNhBLS3mRWM7lTMnPCHT2GiHhAZooIJTNnX0Z0uOIJdVHO2OGMG2pE/AzKO9Digr+LpW3EsVpnj2Zt8Lk6bRng8AIQYxobWKSacAAAAABJRU5ErkJggg==');
	/* esquina inferior izquierda */
	this.esquinas['eII'] = new Array('N6tQdcQ', 'jSURBVBjTfc2hEUJBFEPRs/87DEWgMRQC7hVEDVQRCYoe6IEKmKEDMLu4JepO5k7SkryxNcmChz9ZcO38mQk3vKYLVfXEBW22AOcujavf3ZpklHes2GMzhAZJVJXOOxxxwuELneoWlGMh8fQAAAAASUVORK5CYII=');
	/* esquina inferior derecha */
	this.esquinas['eID'] = new Array('LVYyjL4', 'cSURBVBjTfc/BCcJQGATh7wVr3HYEaxCL+G/GNsQOghUkIN7Vi7kEXua6w8C2qvrq8x7s8+gJa/W6V1gw9oSGS5Jp2GTX9BlHaJsX83884QMHvHDHiFuSJ1SVJH43yhunwsm2ewAAAABJRU5ErkJggg==');
	/* eliminamos la definicion del metodo */
	this.buildImgs = undefined;
};
/**
 * Iniciamos la creacion de la ventana
 */
Window.prototype.init = function() {
	/* creamos la ventna */
	this.create();
	/* asignamos las propiedades de la ventana */
	this.addProperties();
	/* eliminamos la definicion del metodo */
	this.init = undefined;
};
/**
 * Creamos la ventana
 */
Window.prototype.create = function() {
	/* creamos la ventana */
	this.win = document.createElement('DIV');
	/* iniciaremos la ventana oculta */
	this.getWindow().style.opacity = 0;
	/* creamos una tabla para el contenido de la ventana */
	this.getWindow().appendChild(this.getBaseTable());
	/* agregamos el div al entorno */
	document.getElementsByTagName('body')[0].appendChild(this.getWindow());
	/* eliminamos la definicion del metodo */
	this.create = undefined;
};
/**
 * Creamos la tabla central de la ventna
 * 
 * @return Tabla Contenedora central de la ventna
 */
Window.prototype.getBaseTable = function() {
	/* creamos una tabla */
	var tabla = document.createElement('TABLE');
	/* asignamos el 100% de tamano */
	tabla.style.height = '100%';
	tabla.style.width = '100%';
	/* eliminamos el espacio de los bordes */
	tabla.style.borderCollapse = "collapse";
	tabla.style.borderSpacing = 0;
	tabla.style.borderWidth = 0;
	/* agregamos la fila superior a la tabla */
	tabla.appendChild(this.getSupRow());
	/* agregamos la fila central a la tabla */
	tabla.appendChild(this.getMidRow());
	/* agregamos la fila inferior a la tabla */
	tabla.appendChild(this.getInfRow());
	/* eliminamos la definicion del metodo */
	this.getBaseTable = undefined;
	/* retornamos la tabla */
	return tabla;
};
/**
 * Creamos la fila superior
 * 
 * @return Row Fila superior de la ventana
 */
Window.prototype.getSupRow = function() {
	/* creamos una fila */
	var row = document.createElement('TR');
	/* asignamos la opacidad al borde */
	row.style.opacity = 0.5;
	/* creamos un array para las columnas */
	var cols = new Array();
	/* agregamos tres celdas */
	cols['eSI'] = document.createElement('TD');
	cols['bS'] = document.createElement('TD');
	cols['eSD'] = document.createElement('TD');
	/* agregamos las imagenes de las esquinas */
	cols['eSI'].style.backgroundImage = this.getImg('eSI', this.isFixed());
	cols['eSD'].style.backgroundImage = this.getImg('eSD', this.isFixed());
	/* asignamos el color del fondo del borde superior */
	cols['bS'].style.backgroundColor = '#AAA';
	/* asignamos el tamano del fondo del borde superior */
	cols['bS'].style.height = '8px';
	/* verificamos si es fijo */
	if (!this.isFixed()) {
		/* asignamos el estilo del mouse */
		cols['eSI'].style.cursor = 'move';
		cols['bS'].style.cursor = 'move';
		cols['eSD'].style.cursor = 'move';
		/* asignamos los eventos de seleccion */
		row.addEventListener('mousedown', this.onselect, false);
		row.addEventListener('mouseup', this.ondeselect, false);
	}
	/* agregamos las celdas a la fila */
	for ( var col in cols) {
		/* agregamos la celda */
		row.appendChild(cols[col]);
	}
	/* eliminamos la definicion del metodo */
	this.getSupRow = undefined;
	/* retornamos la fila */
	return row;
};
/**
 * Creamos la fila central
 * 
 * @return Row Fila central de la ventana
 */
Window.prototype.getMidRow = function() {
	/* creamos una fila */
	var row = document.createElement('TR');
	/* creamos un array para las columnas */
	var cols = new Array();
	/* agregamos tres celdas */
	cols['bI'] = document.createElement('TD');
	this.content = document.createElement('TD');
	cols['bD'] = document.createElement('TD');
	/* asignamos el color del fondo del borde izquierdo */
	cols['bI'].style.backgroundColor = '#AAA';
	/* asignamos el tamano del fondo del borde izquierdo */
	cols['bI'].style.width = '6px';
	cols['bI'].style.opacity = 0.5;
	/* asignamos los estilos al contenido */
	with (this.content.style) {
		/* agregamos los espacios para el contenido */
		padding = '5px';
		/* ponemos el fondo opaco */
		backgroundColor = '#FFF';
		/* centramos el contenido */
		textAlign = 'center';
		verticalAlign = 'middle';
	}
	/* asignamos el color del fondo del borde derecho */
	cols['bD'].style.backgroundColor = '#AAA';
	/* asignamos el tamano del fondo del borde derecho */
	cols['bD'].style.width = '6px';
	cols['bD'].style.opacity = 0.5;
	/* verificamos si es fijo */
	if (!this.isFixed()) {
		/* asignamos el estilo del mouse */
		cols['bI'].style.cursor = 'move';
		cols['bD'].style.cursor = 'move';
		/* asignamos los eventos de seleccion */
		cols['bI'].addEventListener('mousedown', this.onselect, false);
		cols['bD'].addEventListener('mousedown', this.onselect, false);
		cols['bI'].addEventListener('mouseup', this.ondeselect, false);
		cols['bD'].addEventListener('mouseup', this.ondeselect, false);
	}
	/* agregamos la celda izquierda */
	row.appendChild(cols['bI']);
	/* agregamos la celda central */
	row.appendChild(this.content);
	/* agregamos la celda derecha */
	row.appendChild(cols['bD']);
	/* eliminamos la definicion del metodo */
	this.getMidRow = undefined;
	/* retornamos la fila */
	return row;
};
/**
 * Creamos la fila inferior de la ventana
 * 
 * @return Row Fila inferior de la ventana
 */
Window.prototype.getInfRow = function() {
	/* creamos una fila */
	var row = document.createElement('TR');
	/* asignamos la opacidad al borde */
	row.style.opacity = 0.5;
	/* creamos un array para las columnas */
	var cols = Array();
	/* agregamos tres celdas */
	cols['eII'] = document.createElement('TD');
	cols['bI'] = document.createElement('TD');
	cols['eID'] = document.createElement('TD');
	/* agregamos las imagenes de las esquinas */
	cols['eII'].style.backgroundImage = this.getImg('eII', this.isFixed());
	cols['eID'].style.backgroundImage = this.getImg('eID', this.isFixed());
	/* asignamos el color del fondo del borde superior */
	cols['bI'].style.backgroundColor = '#AAA';
	/* asignamos el tamano del fondo del borde superior */
	cols['bI'].style.height = '8px';
	/* agregamos las celdas a la fila */
	for ( var col in cols) {
		/* verificamos si es fijo */
		if (!this.isFixed()) {
			/* asignamos los eventos de seleccion */
			cols[col].addEventListener('mousedown', this.onselect, false);
			cols[col].addEventListener('mouseup', this.ondeselect, false);
		}
		/* agregamos la celda */
		row.appendChild(cols[col]);
	}
	/* verificamos si es fijo */
	if (!this.isFixed()) {
		/* asignamos el estilo del mouse */
		cols['eII'].style.cursor = 'move';
		cols['bI'].style.cursor = 'move';
		cols['eID'].style.cursor = 'se-resize';
		/* asignamos el evento resize */
		cols['eID'].addEventListener('mousedown', this.onresize, false);
	}
	/* eliminamos la definicion del metodo */
	this.getInfRow = undefined;
	/* retornamos la fila */
	return row;
};
/**
 * Seteamos las propiedades a la ventana
 */
Window.prototype.addProperties = function() {
	/* asignamos los estilos de la ventana */
	with (this.getWindow().style) {
		/* seteamos la ventana flotante */
		position = 'absolute';
		/* seteamos la posicion de la ventana */
		zIndex = this.getZIndex();
		/* verificamos si se asigno el tamano */
		if (this.getWidth() > 0)
			/* asignamos el tamano */
			width = this.getWidth();
		/* verificamos si se asigno el tamano */
		if (this.getHeight() > 0)
			/* asignamos el tamano */
			height = this.getHeight();
	}
	/* eliminamos la definicion del metodo */
	this.addProperties = undefined;
};
/**
 * Centramos la ventana en el entorno
 */
Window.prototype.center = function() {
	/* verificamos si la ventana ya esta creada */
	if (!this.isCreated()) {
		/* creamos un puntero */
		var me = this;
		/* creamos un timeout */
		setTimeout(function() {
			/* mostramos la ventana */
			me.center();
		}, 100);
		/* retornamos */
		return;
	}
	/* asignamos los estilos de la ventana */
	with (this.getWindow().style) {
		/* seteamos la posicion al centro */
		left = document.body.clientWidth / 2 - this.getWindow().clientWidth / 2;
		/* seteamos la posicion al centro */
		top = document.body.clientHeight / 2 - this.getWindow().clientHeight / 2;
	}
};
/**
 * Actualizamos la posicion de la ventana
 * 
 * @param Boolean Actualizar desde la posicion Left
 * @param Boolean Actualizar desde la posicion Top
 */
Window.prototype.updatePosition = function(upLeft, upTop) {
	/* verificamos si la ventana ya esta creada */
	if (!this.isCreated()) {
		/* creamos un puntero */
		var me = this;
		/* creamos un timeout */
		setTimeout(function() {
			/* mostramos la ventana */
			me.updatePosition(upLeft, upTop);
		}, 100);
		/* retornamos */
		return;
	}
	/* verificamos si actualizamos la posicion left */
	if ((upLeft === undefined || upLeft === true) && this.getLeft() > 0)
		/* actualizamos la posicion al centro */
		this.getWindow().style.left = this.getLeft();
	/* verificamos si actualizamos la posicion top */
	if ((upTop === undefined || upTop === true) && this.getTop() > 0)
		/* actualizamos la posicion al centro */
		this.getWindow().style.top = this.getTop();
};
/**
 * Mostramos la ventana
 * 
 * @return Boolean False si la ventana ya esta visible
 */
Window.prototype.show = function() {
	/* verificamos si la ventana ya esta creada */
	if (!this.isCreated()) {
		/* creamos un puntero */
		var me = this;
		/* creamos un timeout */
		setTimeout(function() {
			/* mostramos la ventana */
			me.show();
		}, 100);
		/* retornamos */
		return true;
	}
	/* verificamos si la ventana ya esta visible */
	if (this.getWindow().style.opacity == 1)
		/* retornamos false */
		return false;
	/* creamos un puntero a la ventana */
	var puntero = this.getWindow();
	/* creamos una variable para la opacidad */
	var opacity = 0;
	/* mostramos la ventana */
	var showing = setInterval(function() {
		/* aumentamos la opacidad */
		opacity += 0.1;
		/* aumentamos la opacidad de la ventana */
		puntero.style.opacity = opacity;
		/* verificamos si la opacidad ya es 1 */
		if (puntero.style.opacity == 1) {
			/* eliminamos el timeout */
			clearInterval(showing);
		}
	}, 40);
	/* retornamos true */
	return true;
};
/**
 * Cerramos la ventana
 * 
 * @return Boolean False si la ventana no esta visible
 */
Window.prototype.close = function() {
	/* verificamos si la ventana esta visible */
	if (this.getWindow().style.opacity <= 0)
		/* retornamos false */
		return false;
	/* creamos un puntero */
	var puntero = this.getWindow();
	/* creamos una variable para la opacidad */
	var opacity = 1;
	/* ocultamos la ventana */
	var destroying = setInterval(function() {
		/* disminuimos la opacidad */
		opacity -= 0.1;
		/* aumentamos la opacidad de la ventana */
		puntero.style.opacity = opacity;
		/* verificamos si la opacidad ya es 1 */
		if (puntero.style.opacity <= 0) {
			/* eliminamos el timeout */
			clearInterval(destroying);
			/* eliminamos el div */
			puntero.parentNode.removeChild(puntero);
		}
	}, 20);
	/* elimianos la definicion de la instancia */
	this.__destruct();
	/* retornamos true */
	return true;
};
/**
 * Agregamos contenido a la ventana
 * 
 * @param Mixed Contenido para la ventana
 */
Window.prototype.addContent = function(content) {
	/* verificamos si la ventana ya se creo */
	if (!this.isCreated()) {
		/* creamos un puntero */
		var me = this;
		/* creamos un timeout */
		setTimeout(function() {
			/* agregamos el contenido */
			me.addContent(content);
		}, 100);
		/* retornamos */
		return;
	}
	/* agregamos el contenido */
	this.content.innerHTML += content;
};
/**
 * Asignamos el nuevo contenido de la ventana
 * 
 * @param Mixed Nuevo contenido para la ventana
 */
Window.prototype.setContent = function(newContent) {
	/* verificamos si la ventana ya se creo */
	if (!this.isCreated()) {
		/* creamos un puntero */
		var me = this;
		/* creamos un timeout */
		setTimeout(function() {
			/* agregamos el contenido */
			me.setContent(newContent);
		}, 100);
		/* retornamos */
		return;
	}
	/* reemplazamos el contenido actual */
	this.content.innerHTML = newContent;
};
/**
 * Metodo que se ejecuta al seleccionar la ventana
 * 
 * @param Event Evento JS
 */
Window.prototype.onselect = function(e) {
	/* obtenemos el padre */
	var obj = this.parentNode;
	/* buscamos el div */
	while (obj.nodeName != 'DIV') {
		obj = obj.parentNode;
	}
	/* almacenamos la posicion del click */
	window.XClick = e.layerX;
	window.YClick = e.layerY;
	/* asignamos la opacidad */
	obj.style.opacity = 0.75;
	for ( var i = 1; i <= 50; i++)
		obj.style.zIndex++;
	/* asignamos la funcion a window */
	window.onmousemove = function(event) {
		/* asignamos la posicion con respecto al mouse */
		obj.style.left = event.clientX - this.XClick + document.body.scrollLeft;
		/* asignamos la posicion con respecto al mouse */
		obj.style.top = event.clientY - this.YClick + document.body.scrollTop;
	};
};
/**
 * Metodo que se ejecuta al deseleccionar la ventana
 */
Window.prototype.ondeselect = function() {
	/* obtenemos el padre */
	var obj = this.parentNode;
	/* buscamos el div */
	while (obj.nodeName != 'DIV')
		obj = obj.parentNode;
	/* elimiamos la funcion de window */
	window.onmousemove = function() {};
	/* asignamos la opacidad */
	obj.style.opacity = 1;
	for ( var i = 1; i <= 50; i++)
		obj.style.zIndex--;
};
/**
 * Metodo que se ejecuta al redimencionar la ventana
 * 
 * @param Event Evento JS
 */
Window.prototype.onresize = function(e) {
	/* obtenemos el padre */
	var obj = this.parentNode;
	/* buscamos el div */
	while (obj.nodeName != 'DIV')
		obj = obj.parentNode;
	/* asignamos la opacidad */
	obj.style.opacity = 0.75;
	for ( var i = 1; i <= 50; i++)
		obj.style.zIndex++;
	/* almacenamos la posicion del click */
	window.XClick = e.layerX;
	window.YClick = e.layerY;
	/* asignamos la funcion a window */
	window.onmousemove = function(event) {
		/* asignamos el tamano con respecto al mouse */
		obj.style.height = event.clientY - parseInt(obj.style.top) + 6;
		/* asignamos el tamano con respecto al mouse */
		obj.style.width = event.clientX - parseInt(obj.style.left) + 6;
	};
};
/**
 * Obtenemos el nombre de la instancia
 * 
 * @return String Nombre de la instancia
 */
Window.prototype.getName = function() {
	/* retornamos el nombre */
	return this.name;
};
/**
 * Retornamos una imagen de una esquina de la ventana
 * 
 * @param idImg ID de la esquina a obtener
 * @return String Cadena de la imagen
 */
Window.prototype.getImg = function(idImg) {
	/* retornamos el codigo completo de la imagen */
	return 'url(data:image/png;base64,' + this.imgStart + this.esquinas[idImg][0] + this.imgMiddle + this.esquinas[idImg][1] + ')';
};
/**
 * Retornamos la ventana
 * 
 * @return DIV Ventana
 */
Window.prototype.getWindow = function() {
	/* retornamos la ventana (DIV) */
	return this.win;
};
/**
 * Retornamos si la ventana es fija
 * 
 * @return Boolean Ventana fija
 */
Window.prototype.isFixed = function() {
	/* retornamos si la ventna es fija */
	return this.fixed;
};
/**
 * Verificamos si la ventana esta creada
 * 
 * @return Boolean True si la ventana ya esta creada
 */
Window.prototype.isCreated = function() {
	/* retornamos el estado de la ventana */
	return this.getWindow() != null && this.content != null;
};
/**
 * Retornamos el valor del zIndex de la ventana
 * 
 * @return Number zIndex de la ventna
 */
Window.prototype.getZIndex = function() {
	/* retornamos el zIndex establecido */
	return this.zIndex;
};
/**
 * Retornamos la altura para la ventana
 * 
 * @return Number Altura para la ventana
 */
Window.prototype.getHeight = function() {
	/* retornamos la altura para la ventnana */
	return this.height;
};
/**
 * Retornamos el ancho para la ventana
 * 
 * @return Number Ancho para la ventana
 */
Window.prototype.getWidth = function() {
	/* retornamos el ancho para la ventnana */
	return this.width;
};
/**
 * Retornamos la posicion desde la izquierda para la ventana
 * 
 * @return Number Posicion de la ventana
 */
Window.prototype.getLeft = function() {
	/* retornamos la posicion left de la ventana */
	return this.left;
};
/**
 * Almacenamos la posicion desde la izquierda para la ventana
 * 
 * @param Number posicion para el left
 */
Window.prototype.setLeft = function(newLeft) {
	/* almacenamos la posicion left para la ventana */
	this.left = newLeft;
	/* actualizamos la posicion de la ventana */
	this.updatePosition(true, false);
};
/**
 * Retornamos la posicion desde arriba para la ventana
 * 
 * @return Number Posicion de la ventana
 */
Window.prototype.getTop = function() {
	/* retornamos la posicion top de la ventana */
	return this.top;
};
/**
 * Almacenamos la posicion desde arriba para la ventana
 * 
 * @param Number posicion para el top
 */
Window.prototype.setTop = function(newTop) {
	/* almacenamos la posicion top para la ventana */
	this.top = newTop;
	/* actualizamos la posicion de la ventana */
	this.updatePosition(false, true);
};